import pymysql

conn = None
cursor = None
try:
    conn = pymysql.connect(host='192.168.174.132', port=3306, user='root', password='iTest_2022_mysql',
                           database='test_db', charset='utf8')
    # 开始事务
    conn.begin()
    '''先声明创建游标cursor'''
    cursor = conn.cursor()
    '''使用SQL语句'''
    # 都用%s变量代替
    insert_sql = "INSERT INTO user_profile VALUES(%s,%s,%s,%s,%s,%s);"
    '''数据列表'''
    # 具体数据，列表中放tuple元组[(),()...()] 注意null是None,且符合sql语法''
    data = [(1, 2138, 'male', 21, '北京大学', 'BeiJing'),
            (2, 3214, 'male', None, '复旦大学', 'Shanghai'),
            (3, 6543, 'female', 20, '北京大学', 'BeiJing'),
            (4, 2315, 'female', 23, '浙江大学', 'ZheJiang'),
            (5, 5432, 'male', 25, '山东大学', 'Shandong')]
    '''
    # 知识点补充：
    # 1.使用SQL语句和数据列表，执行execute多条dml语句：
    
    # 方法一：调用execute(insert_sql, one_data)
    # 一次执行一条，循环data数据列表，data中数据，1次给1条元组()
    # for i in data:
    #     cursor.execute(insert_sql, i)
    
    # 方法二：调用executemany(insert_sql, whole_data)
    # 一次执行多条，直接明确执行多条，调用executemany，数据给多个元组()，data整个[(),()]
    # cursor.executemany(insert_sql, whole_data)
    
    # 2.游标声明创建方式：
    # 方式一：可以先声明创建游标
    # 方式二：也可以在with中创建游标，代码在缩进中写

    with conn.cursor() as cursor:
        for row in data:
            cursor.execute(insert_sql, row)
    
    with conn.cursor() as cursor:
        for row in data:
            cursor.executemany(insert_sql, data)                
    '''
    # 一次性执行多条语句
    cursor.executemany(insert_sql, data)
    # 提交事务
    conn.commit()
except Exception as err:
    print('错误信息:', err)
    # 回滚事务
    conn.rollback()
    pass
finally:
    cursor.close()
    conn.close()
